#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <json-c/json.h>
#include "ipc.h"

// 中二台词库（按工作区编号对应）
const char* workspace_quotes[10] = {
    "哎呀，你切到了不存在的工作区！", // 0号（一般不用）
    "第一战场已激活！准备迎战！",     // 1
    "第二阵地请求支援！over~",       // 2
    "第三工区正在生产摸鱼道具！",     // 3
    "第四象限发现BUG巢穴！",          // 4
    "第五维度的咖啡已经煮好了！",     // 5
    "第六基地正在播放《孤勇者》！",   // 6
    "第七空间的代码已渡劫成功！",     // 7
    "第八次元的猫咪占领了鼠标！",     // 8
    "第九重天的编译终于通过了！"      // 9
};

// 连接到i3的IPC socket
int connect_to_i3() {
    const char* socket_path = getenv("I3SOCK");
    if (!socket_path) {
        fprintf(stderr, "找不到i3的socket！你确定在i3里运行吗？\n");
        return -1;
    }

    int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("创建socket失败");
        return -1;
    }

    struct sockaddr_un addr;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);

    if (connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
        perror("连接i3失败");
        close(sockfd);
        return -1;
    }

    return sockfd;
}

// 订阅工作区事件
void subscribe_to_workspaces(int sockfd) {
    const char* payload = "[\"workspace\"]"; // 只订阅工作区事件
    i3_ipc_header_t header;

    strncpy(header.magic, I3_IPC_MAGIC, 6);
    header.size = strlen(payload);
    header.type = I3_IPC_MESSAGE_TYPE_SUBSCRIBE;

    // 发送订阅请求
    write(sockfd, &header, sizeof(header));
    write(sockfd, payload, header.size);

    // 读取订阅结果（简单处理，不校验了）
    char buf[1024];
    read(sockfd, &header, sizeof(header));
    read(sockfd, buf, header.size);
    printf("订阅结果：%s\n", buf);
    printf("现在切换工作区试试？中二之魂即将燃烧！\n");
}

// 处理收到的工作区事件
void handle_events(int sockfd) {
    i3_ipc_header_t header;
    char* payload;

    while (1) {
        // 读取事件头部
        if (read(sockfd, &header, sizeof(header)) != sizeof(header)) {
            perror("读取事件失败");
            break;
        }

        // 检查是不是工作区事件
        if (header.type != I3_IPC_EVENT_WORKSPACE)
            continue;

        // 读取事件内容（JSON）
        payload = malloc(header.size + 1);
        read(sockfd, payload, header.size);
        payload[header.size] = '\0';

        // 解析JSON，获取工作区编号
        json_object* root = json_tokener_parse(payload);
        json_object* current;
        if (json_object_object_get_ex(root, "current", &current)) {
            json_object* num_obj;
            if (json_object_object_get_ex(current, "num", &num_obj)) {
                int ws_num = json_object_get_int(num_obj);
                // 输出对应台词（超过10号工作区就用默认句）
                if (ws_num >= 0 && ws_num < 10)
                    printf("\n【系统提示】%s\n", workspace_quotes[ws_num]);
                else
                    printf("\n【系统提示】这位道友，你的工作区编号已经突破次元壁了！\n");
            }
        }

        // 清理内存
        json_object_put(root);
        free(payload);
    }
}

int main() {
    printf("===== i3中二工作区播报器 =====\n");
    int sockfd = connect_to_i3();
    if (sockfd == -1)
        return 1;

    subscribe_to_workspaces(sockfd);
    handle_events(sockfd);

    close(sockfd);
    return 0;
}
